package com.njts.array;

/**
 * @author David GE
 * Date  2025/11/13
数据排序操作:随处可见 "运算"->数据的处理 排序
排序算法:1 比较排序:数据之间两两比较,确定顺序的排序方法
1) 冒泡排序 2) 选择排序
 */
public class ArraySort {
    public static void main(String[] args) {

        int[] data = new int[]{13, 0, 35, 23, 90,6};

        // 1 将data[0] 设为max 将max与其相邻的下一个元素两两比较(升序),将较大的数排在后面 将max值设置为较大的数
        //2 用max值与其相邻的下一个元素再比较,得到新的max
        // 3 重复2步骤,直至数组末尾(一轮比较结束) 得出本轮的最大值,且max置于数组的最后一位
        // 4 将max置空,从data[0] 开始,重复1-3,每次比较的终点比前一次减少一位,至数组整体升序
        //for (int i = 0; i <data.length-1 ; i++) {
        //    // 一轮比较  选出数组中第i+1大的元素
        //    for (int j = 0; j < data.length-1-i; j++) {
        //        // i    j
        //        // 0    0   length-0-1
        //        // 1    0   length-1-1
        //        // 2    0   length-2-1
        //
        //        // 循环内部将当前元素与下一个相邻元素比较,大的放后,两两交换
        //        // 两层循环 外n-1内n-1-i 相邻比较,小的靠前
        //        if (data[j]>data[j+1]){
        //            int temp=data[j];
        //            data[j]=data[j+1];
        //            data[j+1]=temp;
        //        }
        //    }
        //}

        // 选择排序
        //1.遍历数组,设定目标元素data[i] i代表本轮比较的起始元素的下标
        // 2 目标元素与数组所有元素比较,(比较过程中只替换最小元素的下标),若当前元素<目标元素,记录索引,直到末尾
        // 3 将记录下来的最小元素的索引指向的元素与当前的目标元素互换,则成为新的目标元素
        //4 下一轮比较从新的目标元素的位置开始(前面的元素已然有序,无需重复比较)
        for (int i = 0; i < data.length-1; i++) {
            int minIndex =i;
            for (int j = i+1; j <data.length ; j++) {
                // 内循环替换是下标
                if (data[j]<data[minIndex]){
                    minIndex=j;
                }
            }
            // 现在minIndex指向的就是当前新的目标元素,交换
            int t = data[i];
            data[i] = data[minIndex];
            data[minIndex]=t;
        }
        for (int datum : data) {
            System.out.printf("%d ",datum );
        }




    }
}
